﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Sistema_Totem.Datos.SqlServer;
using Sistema_Totem.Logica.Excepciones;

namespace Sistema_Totem.Logica.Clases
{
    public class Cliente: Persona
    {
        Int32 idPersona;
        String rif;
        String logo;
        String direccion;
        String estatus;

        #region Constructor

        public Cliente()
        {
            
        }

        public Cliente(String Direccion, String Nombre, String Telefono, String Correo, String Rif, String Estatus, String Logo)
        {
            rif = Rif;
            this.Nombre = Nombre;
            this.Telefono = Telefono;
            this.Correo = Correo;
            direccion = Direccion;
            estatus = Estatus;
            logo = Logo;
        }
        #endregion Constructor

        #region Getter y setter

        public String Rif
        {
            get { return rif; }
            set { rif = value; }
        }

        public String Direccion
        {
            get { return direccion; }
            set { direccion = value; }
        }

        public String Estatus
        {
            get { return estatus; }
            set { estatus = value; }
        }

        public String Logo
        {
            get { return logo; }
            set { logo = value; }
        }

        public Int32 IdPersona
        {
            get { return idPersona; }
            set { idPersona = value; }
        }
        #endregion Getter y setter

        #region Metodos para la gestion de cliente

        #region Agregar Cliente
            /// <summary>
            /// Agregar cliente: Este metodo hace el llamado a la capa de persistenca para registrar el nuevo cliente
            /// </summary>
            /// <param name="cliente">Recibe un objeto del tipo cliente</param>
            /// <returns>Retorna el mensaje de confirmacion de la accion, bien sea positivo o negeativo</returns>
              public String AgregarCliente(Cliente cliente) 
            {
                String verificacion;
                try
                {
                    //Se instancia un objeto del tipo SqlServerCliente
                    SqlServerCliente serverCliente = new SqlServerCliente();
                    // Se retorna un mensaje de exito si el cliente fue insertado 
                    verificacion = serverCliente.AgregarCliente(cliente);
                }
                catch (Exception e) 
                {
                    verificacion = e.Message;
                }

                return verificacion;
            }

        #endregion Agregar Cliente

        #region Modificar Cliente

            /// <summary>
            /// Actualizar los datos de un cliente
            /// </summary>
            /// <param name="miClienteActual">Recibe en un objeto del tipo cliente, con todos sus datos</param>
            /// <returns>Retorna un mensaje de confirmacion sobre la transaccion</returns>
            public String ActualizarDatosCliente(Cliente miClienteActual)
            {
                String verificacion;
                
                try 
                {
                    SqlServerCliente serverCliente = new SqlServerCliente();
                    verificacion= serverCliente.modificarCliente(miClienteActual) ;
                }
                catch (Exception e)
                {
                    verificacion = e.Message;                
                }

                return verificacion;
            
            }

        #endregion Modificar Cliente

        #region Consultar Clientes

            /// <summary>
            /// Consulta todos los clientes registrados
            /// </summary>
            /// <returns>Lista de clientes registrados en el sistema </returns>
            public List<Cliente> ConsultarClientes()
            {
                List<Cliente> miListaClientes = null;
                try
                {
                    //Se instancia un objeto del tipo SqlServerCliente
                    SqlServerCliente serverCliente = new SqlServerCliente();
                    // Se retorna la lista de clientes existentes registrados en la base de datos
                    miListaClientes = serverCliente.ConsultarClientes();
                }

                catch (NullReferenceException error)
                {
                    throw (new ClienteExcepcion("No hay cliente(s) registrado(s)", error));
                }
                catch (Exception errorGeneral)
                {
                    throw (new ClienteExcepcion("Operación fallida", errorGeneral));
                }

                return miListaClientes;
            }

            /// <summary>
            /// Consulta los detalles de un cliente
            /// </summary>
            /// <param name="miRif">Se consulta por el numero de rif</param>
            /// <returns>Retorna un objeto del tipo cliente</returns>
            public Cliente ConsultarDetallesCliente(String miRif) 
            {
                Cliente miCliente = new Cliente();

                try
                {
                    SqlServerCliente serverCliente = new SqlServerCliente();
                    miCliente = serverCliente.ConsultarDetallesCliente(miRif);
                }
                catch (NullReferenceException error)
                {
                    throw (new ClienteExcepcion("No hay cliente(s) registrado(s)", error));
                }
                catch (Exception errorGeneral)
                {
                    throw (new ClienteExcepcion("Operación fallida", errorGeneral));
                }
                return miCliente;
            }
        #endregion Consultar Clientes

        #endregion Metodos para la gestion de cliente
    }
}